SageMaker HyperPod クラスター起動で必要な IAM 周りをまとめてみた
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
SageMaker HyperPod を触るにあたり、IAM ロールに追加の IAM ポリシーが必要なケースがいくつか考えられます。今回は Slurm, EKS オーケストレーター別に、必要なケースと IAM ポリシーを洗い出してみたいと思います。
Slurm
Slurm オーケストレータの場合、IAM ロールは SageMaker HyperPod の IAM ロールのみ作成します。信頼ポリシーには、以下を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sagemaker.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
非 VPC 環境(AWS マネージドな VPC 利用)
FSx for Lustre を使わないなど、非 VPC な環境(AWS マネージドな VPC)での利用ケースの場合は、AmazonSageMakerClusterInstanceRolePolicy を SageMaker HyperPod の IAM ロールにアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CloudwatchLogStreamPublishPermissions",
"Effect": "Allow",
"Action": [
"logs:PutLogEvents",
"logs:CreateLogStream",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*:log-stream:*"
]
},
{
"Sid": "CloudwatchLogGroupCreationPermissions",
"Effect": "Allow",
"Action": ["logs:CreateLogGroup"],
"Resource": ["arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*"]
},
{
"Sid": "CloudwatchPutMetricDataAccess",
"Effect": "Allow",
"Action": ["cloudwatch:PutMetricData"],
"Resource": ["*"],
"Condition": {
"StringEquals": {
"cloudwatch:namespace": "/aws/sagemaker/Clusters"
}
}
},
{
"Sid": "DataRetrievalFromS3BucketPermissions",
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetObject"],
"Resource": ["arn:aws:s3:::sagemaker-*"],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "${aws:PrincipalAccount}"
}
}
},
{
"Sid": "SSMConnectivityPermissions",
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
VPC 環境
VPC 環境で利用する場合は AmazonSageMakerClusterInstanceRolePolicy に加え、以下のポリシーをアタッチする必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateNetworkInterface",
"ec2:CreateNetworkInterfacePermission",
"ec2:DeleteNetworkInterface",
"ec2:DeleteNetworkInterfacePermission",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeVpcs",
"ec2:DescribeDhcpOptions",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DetachNetworkInterface"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ec2:CreateTags",
"Resource": [
"arn:aws:ec2:*:*:network-interface/*"
]
}
]
}
sagemaker-
から始まらない S3 バケットの利用
ライフサイクルスクリプトなどで sagemaker-
から始まらない、S3 バケットを利用する場合は、追加の権限が必要です。次のポリシーを追加で付与します。対象のバケット ARN
は適宜変更します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"対象のバケット ARN",
"対象のバケット ARN/*",
]
}
]
}
管理者
HyperPod クラスターを管理できるように、以下の権限を付与してあげましょう。
ライフサイクルスクリプト、VPC を利用するのであれば VPC とその周辺リソース(Lustre 等)のアクセス権限も付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sagemaker:CreateCluster",
"sagemaker:ListClusters"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"sagemaker:DeleteCluster",
"sagemaker:DescribeCluster",
"sagemaker:DescribeClusterNode",
"sagemaker:ListClusterNodes",
"sagemaker:UpdateCluster",
"sagemaker:UpdateClusterSoftware",
"sagemaker:BatchDeleteClusterNodes"
],
"Resource": "arn:aws:sagemaker:region:account-id:cluster/*"
}
]
}
IAM Group や IAM ロールに付与できる IAM ポリシーの数にはハードリミットがあるため、必要に応じてジョブ管理ポリシーを検討してあげましょう。
研究者
研究者が HyperPod ノードにログインできるよう設定が必要です。SSM 経由でログインできるよう以下を設定します。必要に応じて、ライフサイクルスクリプト用 S3 バケットへのアクセス権限を付与すると良いと思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ssm:StartSession", "ssm:TerminateSession"],
"Resource": "*"
}
]
}
EKS
EKS オーケストレータの場合、 IAM ロールは SageMaker HyperPod の IAM ロールに加え、EKS クラスターの IAM ロールが必要です。信頼ポリシーはそれぞれ以下で作成します。
SageMaker HyperPod の IAM ロール
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sagemaker.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EKS クラスターの IAM ロール
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
SageMaker HyperPod の IAM ロール
EKS の場合は必然的に VPC 環境でのホストになります。そのため、AmazonSageMakerClusterInstanceRolePolicy と VPC 環境で利用する追加のポリシーが必要になります。VPC で利用するためのポリシーですが、 Slurm と EKS で内容が異なるため注意です。
AmazonSageMakerClusterInstanceRolePolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CloudwatchLogStreamPublishPermissions",
"Effect": "Allow",
"Action": [
"logs:PutLogEvents",
"logs:CreateLogStream",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*:log-stream:*"
]
},
{
"Sid": "CloudwatchLogGroupCreationPermissions",
"Effect": "Allow",
"Action": ["logs:CreateLogGroup"],
"Resource": ["arn:aws:logs:*:*:log-group:/aws/sagemaker/Clusters/*"]
},
{
"Sid": "CloudwatchPutMetricDataAccess",
"Effect": "Allow",
"Action": ["cloudwatch:PutMetricData"],
"Resource": ["*"],
"Condition": {
"StringEquals": {
"cloudwatch:namespace": "/aws/sagemaker/Clusters"
}
}
},
{
"Sid": "DataRetrievalFromS3BucketPermissions",
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetObject"],
"Resource": ["arn:aws:s3:::sagemaker-*"],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "${aws:PrincipalAccount}"
}
}
},
{
"Sid": "SSMConnectivityPermissions",
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
VPC で利用するためのポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AssignPrivateIpAddresses",
"ec2:CreateNetworkInterface",
"ec2:CreateNetworkInterfacePermission",
"ec2:DeleteNetworkInterface",
"ec2:DeleteNetworkInterfacePermission",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeVpcs",
"ec2:DescribeDhcpOptions",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DetachNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:UnassignPrivateIpAddresses",
"ecr:BatchGetImage",
"ecr:GetAuthorizationToken",
"ecr:GetDownloadUrlForLayer",
"eks-auth:AssumeRoleForPodIdentity"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:CreateTags"
],
"Resource": [
"arn:aws:ec2:*:*:network-interface/*"
]
}
]
}
EKS クラスターの IAM ロール
EKS クラスターの IAM ロールは AmazonEKSClusterPolicy
をアタッチします。
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:UpdateAutoScalingGroup",
"ec2:AttachVolume",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateRoute",
"ec2:CreateSecurityGroup",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteRoute",
"ec2:DeleteSecurityGroup",
"ec2:DeleteVolume",
"ec2:DescribeInstances",
"ec2:DescribeRouteTables",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVolumes",
"ec2:DescribeVolumesModifications",
"ec2:DescribeVpcs",
"ec2:DescribeDhcpOptions",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeAvailabilityZones",
"ec2:DetachVolume",
"ec2:ModifyInstanceAttribute",
"ec2:ModifyVolume",
"ec2:RevokeSecurityGroupIngress",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAddresses",
"ec2:DescribeInternetGateways",
"ec2:DescribeInstanceTopology",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
"elasticloadbalancing:AttachLoadBalancerToSubnets",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:CreateListener",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:CreateLoadBalancerListeners",
"elasticloadbalancing:CreateLoadBalancerPolicy",
"elasticloadbalancing:CreateTargetGroup",
"elasticloadbalancing:DeleteListener",
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DeleteLoadBalancerListeners",
"elasticloadbalancing:DeleteTargetGroup",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:DeregisterTargets",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeLoadBalancerPolicies",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroupAttributes",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:DetachLoadBalancerFromSubnets",
"elasticloadbalancing:ModifyListener",
"elasticloadbalancing:ModifyLoadBalancerAttributes",
"elasticloadbalancing:ModifyTargetGroup",
"elasticloadbalancing:ModifyTargetGroupAttributes",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:RegisterTargets",
"elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
"elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
"kms:DescribeKey"
],
"Resource" : "*"
},
{
"Effect" : "Allow",
"Action" : "iam:CreateServiceLinkedRole",
"Resource" : "*",
"Condition" : {
"StringEquals" : {
"iam:AWSServiceName" : "elasticloadbalancing.amazonaws.com"
}
}
}
]
}
必要に応じてカスタムポリシーを設定できますが、今回は省略します。
Before you can create Amazon EKS clusters, you must create an IAM role with either of the following IAM policies:
- AmazonEKSClusterPolicy
- A custom IAM policy. The minimal permissions that follow allows the Kubernetes cluster to manage nodes, but doesn’t allow the legacy Cloud Provider to create load balancers with Elastic Load Balancing. Your custom IAM policy must have at least the following permissions:
CloudWatch Observability アドオンを利用する場合
タスクガバナンスや HyperPod コンソールのダッシュボード機能を利用したい時に CloudWatch Observability アドオンを EKS クラスターにインストールするケースがあります。その場合は、 CloudWatchAgentServerPolicy を HyperPod の IAM ロールに付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CWACloudWatchServerPermissions",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricData",
"ec2:DescribeVolumes",
"ec2:DescribeTags",
"logs:PutLogEvents",
"logs:PutRetentionPolicy",
"logs:DescribeLogStreams",
"logs:DescribeLogGroups",
"logs:CreateLogStream",
"logs:CreateLogGroup",
"xray:PutTraceSegments",
"xray:PutTelemetryRecords",
"xray:GetSamplingRules",
"xray:GetSamplingTargets",
"xray:GetSamplingStatisticSummaries"
],
"Resource": "*"
},
{
"Sid": "CWASSMServerPermissions",
"Effect": "Allow",
"Action": ["ssm:GetParameter"],
"Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
}
]
}
管理者
EKS クラスター
EKS クラスターを管理するために以下の IAM を付与してあげます。以下はあくまで EKS クラスターに関してのポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": <execution-role-arn>
},
{
"Effect": "Allow",
"Action": [
"sagemaker:CreateCluster",
"sagemaker:DeleteCluster",
"sagemaker:DescribeCluster",
"sagemaker:DescribeCluterNode",
"sagemaker:ListClusterNodes",
"sagemaker:ListClusters",
"sagemaker:UpdateCluster",
"sagemaker:UpdateClusterSoftware",
"sagemaker:BatchDeleteClusterNodes",
"eks:DescribeCluster",
"eks:CreateAccessEntry",
"eks:DescribeAccessEntry",
"eks:DeleteAccessEntry",
"eks:AssociateAccessPolicy",
"iam:CreateServiceLinkedRole"
],
"Resource": "*"
}
]
}
Kubernetes
Kubernetes には、アクセスエントリで認可を管理してあげましょう。
AmazonEKSClusterAdminPolicy や AmazonEKSAdminPolicy が考えられます。
なお、アクセスエントリは HyperPod クラスターのセットアップ時の Helm インストール時には登場するため、早めに設定しておく必要があります。
研究者
研究者も同じくアクセスエントリでカバーできると良いでしょう。特定の名前空間向けに AmazonEKSAdminPolicy 等で許可できると良いと思います。
まとめ
以上、「SageMaker HyperPod クラスター起動で必要な IAM 周りをまとめてみた」でした。
このブログがどなたかの参考になれば幸いです。
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!